Bellman Ford同样是一种单源最短路算法,它的优秀之出在于它可以处理带有负边权的图,我们先来看看核心代码:
|
|
上面的代码中,外循环一共循环了n - 1次(n为顶点的个数),内循环循环了m次(m为边的个数),dist为源点到其余各点的距离。
|
|
上面这两行代码的意思是,看看能否通过第i条边,使得源点到第i条边的终点的距离变短。这其实与dijkstra的松弛操作是一样的。现在我们要把所有的边都松弛一遍。
|
|
在第1轮对所有边进行松弛之后,得到的是从源点只经过一条边到达其余个顶点的最短路径长度。在第2轮对所有的边进行松弛之后,得到的是从源点最多经过两条边到达其余各顶点的最短路径长度。如果进行k轮的话,得到的就是从源点最多经过k条边到达其余各顶点的最短路径长度。
我们最多进行n-1轮松弛就可以了,因为在一个含n个点的图中,任意两点间的最短路径最多包含n-1条边。
热浪大家已经很熟悉了,这道题也可以作为Bellman Ford算法的模板题,大家可以用这道题来检验自己算法的准确性。
|
|